/**
 * 文档管理工具类
 * 提供文档相关的工具函数
 */

// 文件类型映射
const FILE_TYPE_MAP = {
  'pdf': {
    icon: '📕',
    color: '#FF6B6B',
    name: 'PDF文档'
  },
  'doc': {
    icon: '📝',
    color: '#4ECDC4',
    name: 'Word文档'
  },
  'docx': {
    icon: '📝',
    color: '#4ECDC4',
    name: 'Word文档'
  },
  'txt': {
    icon: '📄',
    color: '#95E1D3',
    name: '文本文件'
  },
  'md': {
    icon: '📘',
    color: '#F38181',
    name: 'Markdown文档'
  }
}

// 文档状态映射
const DOCUMENT_STATUS = {
  0: {
    text: '待处理',
    class: 'status-pending',
    color: '#FFC107'
  },
  1: {
    text: '处理中',
    class: 'status-processing',
    color: '#007BFF'
  },
  2: {
    text: '已完成',
    class: 'status-completed',
    color: '#28A745'
  },
  3: {
    text: '处理失败',
    class: 'status-failed',
    color: '#DC3545'
  }
}

/**
 * 获取文件类型信息
 * @param {string} filename - 文件名
 * @returns {object} 文件类型信息
 */
export function getFileTypeInfo(filename) {
  const ext = filename?.split('.').pop()?.toLowerCase()
  return FILE_TYPE_MAP[ext] || {
    icon: '📁',
    color: '#6C757D',
    name: '未知文件'
  }
}

/**
 * 获取文件图标
 * @param {string} filename - 文件名
 * @returns {string} 文件图标
 */
export function getFileIcon(filename) {
  return getFileTypeInfo(filename).icon
}

/**
 * 格式化文件大小
 * @param {number} bytes - 字节数
 * @returns {string} 格式化后的文件大小
 */
export function formatFileSize(bytes) {
  if (!bytes || bytes === 0) return '0 B'
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 获取文档状态信息
 * @param {number} status - 状态码
 * @returns {object} 状态信息
 */
export function getDocumentStatus(status) {
  return DOCUMENT_STATUS[status] || {
    text: '未知状态',
    class: 'status-unknown',
    color: '#6C757D'
  }
}

/**
 * 获取文档状态文本
 * @param {number} status - 状态码
 * @returns {string} 状态文本
 */
export function getStatusText(status) {
  return getDocumentStatus(status).text
}

/**
 * 获取文档状态类名
 * @param {number} status - 状态码
 * @returns {string} 状态类名
 */
export function getStatusClass(status) {
  return getDocumentStatus(status).class
}

/**
 * 格式化日期时间
 * @param {string|Date} date - 日期
 * @returns {string} 格式化后的日期时间
 */
export function formatDateTime(date) {
  if (!date) return ''
  const d = new Date(date)
  return d.toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit'
  })
}

/**
 * 格式化相对时间
 * @param {string|Date} date - 日期
 * @returns {string} 相对时间描述
 */
export function formatRelativeTime(date) {
  if (!date) return ''
  const now = new Date()
  const target = new Date(date)
  const diff = now - target
  
  if (diff < 60000) return '刚刚'
  if (diff < 3600000) return `${Math.floor(diff / 60000)}分钟前`
  if (diff < 86400000) return `${Math.floor(diff / 3600000)}小时前`
  if (diff < 604800000) return `${Math.floor(diff / 86400000)}天前`
  return formatDateTime(date)
}

/**
 * 截断文本
 * @param {string} text - 文本
 * @param {number} maxLength - 最大长度
 * @returns {string} 截断后的文本
 */
export function truncateText(text, maxLength = 50) {
  if (!text) return ''
  
  // 对于微信小程序，优先保留文件扩展名
  if (text.includes('.')) {
    const lastDotIndex = text.lastIndexOf('.')
    const name = text.substring(0, lastDotIndex)
    const ext = text.substring(lastDotIndex)
    
    if (name.length > maxLength - 3) { // 为扩展名和省略号留出空间
      return name.substring(0, maxLength - 3) + '...' + ext
    }
    return text
  }
  
  // 没有扩展名的情况
  return text.length > maxLength ? text.substring(0, maxLength) + '...' : text
}

/**
 * 验证文件类型
 * @param {File} file - 文件对象
 * @param {Array} allowedTypes - 允许的文件类型
 * @returns {boolean} 是否允许
 */
export function validateFileType(file, allowedTypes = ['pdf', 'doc', 'docx', 'txt', 'md']) {
  if (!file || !file.name) return false
  const ext = file.name.split('.').pop()?.toLowerCase()
  return allowedTypes.includes(ext)
}

/**
 * 验证文件大小
 * @param {File} file - 文件对象
 * @param {number} maxSize - 最大大小（MB）
 * @returns {boolean} 是否允许
 */
export function validateFileSize(file, maxSize = 50) {
  if (!file || !file.size) return false
  const fileSizeInMB = file.size / (1024 * 1024)
  return fileSizeInMB <= maxSize
}

/**
 * 获取文件预览信息
 * @param {object} document - 文档对象
 * @returns {object} 预览信息
 */
export function getDocumentPreview(document) {
  if (!document) return null
  
  const fileType = getFileTypeInfo(document.fileName)
  const status = getDocumentStatus(document.status)
  
  return {
    ...document,
    fileType,
    status,
    formattedSize: formatFileSize(document.fileSize),
    formattedDate: formatRelativeTime(document.uploadedAt),
    formattedDateTime: formatDateTime(document.uploadedAt)
  }
}

/**
 * 生成文档操作菜单
 * @param {object} document - 文档对象
 * @returns {Array} 操作菜单项
 */
export function generateDocumentActions(document) {
  if (!document) return []
  
  const actions = []
  
  // 查看详情
  actions.push({
    id: 'view',
    label: '查看详情',
    icon: '👁️',
    action: 'view'
  })
  
  // 重新索引（仅当状态为已完成或失败时）
  if (document.status === 2 || document.status === 3) {
    actions.push({
      id: 'reindex',
      label: '重新索引',
      icon: '🔄',
      action: 'reindex'
    })
  }
  
  // 删除文档
  actions.push({
    id: 'delete',
    label: '删除文档',
    icon: '🗑️',
    action: 'delete',
    type: 'danger'
  })
  
  return actions
}

/**
 * 检查文档是否可编辑
 * @param {object} document - 文档对象
 * @returns {boolean} 是否可编辑
 */
export function canEditDocument(document) {
  return document && document.status === 2 // 仅已完成状态的文档可编辑
}

/**
 * 检查文档是否可删除
 * @param {object} document - 文档对象
 * @returns {boolean} 是否可删除
 */
export function canDeleteDocument(document) {
  return document && document.status !== 1 // 处理中的文档不可删除
}

/**
 * 计算文档处理进度
 * @param {object} document - 文档对象
 * @returns {number} 进度百分比
 */
export function calculateProcessingProgress(document) {
  if (!document) return 0
  
  const statusMap = {
    0: 0,    // 待处理
    1: 50,   // 处理中
    2: 100,  // 已完成
    3: 0     // 处理失败
  }
  
  return statusMap[document.status] || 0
}

/**
 * 获取文档搜索关键词高亮
 * @param {string} content - 内容
 * @param {string} keyword - 关键词
 * @returns {string} 高亮后的内容
 */
export function highlightKeyword(content, keyword) {
  if (!content || !keyword) return content
  
  const regex = new RegExp(`(${keyword})`, 'gi')
  return content.replace(regex, '<mark>$1</mark>')
}

// 默认导出所有工具函数
export default {
  getFileTypeInfo,
  getFileIcon,
  formatFileSize,
  getDocumentStatus,
  getStatusText,
  getStatusClass,
  formatDateTime,
  formatRelativeTime,
  truncateText,
  validateFileType,
  validateFileSize,
  getDocumentPreview,
  generateDocumentActions,
  canEditDocument,
  canDeleteDocument,
  calculateProcessingProgress,
  highlightKeyword
}